package Juego;


import java.util.LinkedList;

import javax.swing.ImageIcon;
import javax.swing.JPanel;

import javazoom.jlgui.basicplayer.BasicPlayer;

import Heroes.Heroe;
import TDAMapeo.Map;
import Villanos.Villano;


public class Tablero{
	
	protected Casillero[][] mat;
	protected LinkedList<Villano>[] filas;
	protected Juego game;
	protected Heroe temp;
	protected boolean eliminar=false;
	
	
	
	/**
	 * Constructor de la clase
	 * @param g Juego
	 */
	public Tablero(Juego g){
		game=g;
		mat=new Casillero[5][9];
		for (int i=4; i>=0;i--)
			for(int j=0;j<9;j++)
				mat[i][j]= new Casillero();
		filas= new LinkedList[5];
		for(int i=0;i<5;i++)
		{
			filas[i]=new LinkedList();
		}
		//temp=null;
		
		
	}



	/**
	 * 
	 * @param fila de villanos a devolver
	 * @return fila e villanos
	 */
	public LinkedList<Villano> getFilaVillanos(int fila) {
		return filas[fila];
	}

	
	/**
	 *Inserta un villano en una fila
	 * @param v Villano
	 * @param fila fila donde insertar el villano
	 */
	public void insertarVillano(Villano v, int fila)
	{
		filas[fila].addLast(v);
	}
	
	
	/**
	 * Permite aumentar el puntaje del jugador
	 * @param puntaje del jugador a sumar
	 */
	public void aumentarPuntaje(int puntaje) {
		
	game.sumarPuntaje(puntaje);
	}

	
	/**
	 * Quita vida al juego
	 * @param vida vida a quitar al juego
	 */
	public void restarVida(int vida) {
	game.restarVida(vida);
		
	}

	/**
	 * Aumenta los puntos de valor 
	 * @param puntosdeValor puntos de valor a aumentar
	 */
	public void aumentarPuntosdeValor(int puntosdeValor) {
	game.aumentarPuntosdeValor(puntosdeValor);
		
	}

	/**
	 * Retorna el mapeo de string en imagenes
	 * @return mapeo de string en imagenes
	 */
	public Map<String, ImageIcon[]> getMapeo(){
	return game.getMapeo();}
	
	
	/**
	 * Retorna la vida restante en el juego
	 * @return vida en el juego
	 */
	public int getVida(){
		return game.getVida();}
	

	/**
	 * Devuelve al heroe que se quiere ingresar al tablero
	 * @return Heroe a ingresar en el tablero
	 */
	public Heroe getTemporal()
	{
		return temp;
	}
	
	
	/**
	 * Setea el heroe a ingresar al tablero
	 * @param h Heroe a ingresar al tablero
	 */
	public void setTemporal(Heroe h)
	{
		temp=h;
	}
	
	
	/**
	 * Permite agregar heroe
	 * @param h Heroe a agregar
	 * @param i Fila en la que se va a agregar
	 * @param j Columna en la que se va a agregar
	 */
	public void agregarHeroe(Heroe h, int i, int j)
	{
		mat [i][j].setHeroe(h);
	}
	
/** 
 * Permite obtener el panel contenedor
 * @return panel contenedor
 */
	public JPanel getPanel(){
		return game.getContenedor();
	}

	
	/**
	 * Retorna el mapeo de sonidos
	 * @return Mapeo de sonidos
	 */
	public Map<String,BasicPlayer> getMapeoSonidos(){
		return game.getMapeoSonidos();
	}
	
	/**
	 * Devuelve los puntos de valor del jugador
	 * @return puntos de valor del jugador
	 */
	public int getPuntosdeValor(){
		return game.getPuntosdeValor();
	}
	
/**
 * Disminuye los puntos de valor del jugador
 * @param puntosdeValor puntos de valor a disminuir del jugador
 */
	public void restarPuntosdeValor(int puntosdeValor ) {
		game.restarPuntosdeValor(puntosdeValor );
		
		
	}

/**
 * Devuelve la fila de heroes
 * @param fila fila de heroes a devolver
 * @return Fila de heroes
 */
	public Casillero[] getFilaHeroes(int fila) {
		// TODO Auto-generated method stub
		return mat[fila];
	}


/**
 * Setea el valor de eliminar
 * @param b nuevo valor de eliminar
 */
	public void setEliminar(boolean b) {
		eliminar=b;
		
	}

/**
 * Devuelve el valor de eliminar
 * @return Valor de eliminar
 */
	public boolean getEliminar() {
		return eliminar;
	}


	/**
	 * Devuelve true si hay villanos en el tablero, falso en caso contrario
	 * @return true si hay villanos en el tablero, falso en caso contrario
	 */
	public boolean noHayVillanos() {
		int i=0;
		boolean noHay=true;
		while (i<=4 && noHay)
		{
			noHay=filas[i].isEmpty();
			i++;
		}
		return noHay;
	}

/**
 * Elimina a todos los heroes del tablero
 */
	public void eliminarHeroes() {
		for (int i=0;i<=4;i++)
			for (int j=0;j<=8;j++)
				if (mat[i][j].getEstaOcupado()){
					mat[i][j].getHeroe().setStop(true);
					mat[i][j].setHeroe(null);}
		
	}


	
}